﻿/***************************************************** 
** 命名空间: ShieldSimulatorWebBLL 
** 文 件 名：DataSimulator 
** 内容简述：
** 版    本：V1.0 
** 创 建 人：伍兆祥
** 创建日期：2018/4/9 13:24:46 
** 修改记录：
日期        版本      修改人    修改内容    
4/10 18:12           伍兆祥    计数60哪里，其实这里有点问题，因为数据是按照一分钟来统计，应该计算当前数据和起始数据时间之差被60整除获得的值作为环号
                               (或者记录一个不可变的静态datetime在初次模拟的时候，每次用它计算也可)
4/13 18:03           伍兆祥    已经实现功能，两种生成规则，个人认为规则2更符合实际需求
*****************************************************/


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using ShieldSimulatorWebModel;

namespace ShieldSimulatorWebBLL
{
    /// <summary>
    /// 仿真器
    /// </summary>
    public class DataSimulator
    {
        #region 起始id
        private static int IdAscend = 1;
        #endregion
        #region 起始环号
        private static int ICircle = 0;//文档中>=0,实际应该没有环号0吧。。emmm
        #endregion
        #region 起始温度
        private static int ITemperature = 50;
        #endregion
        #region 计数60
        //也就是 has1minete=0 时的new实例赋值结束后，给环数+1 然后 has1minete 重置为60，然后-1进入下一次 has1minete=59 循环
        private static int IHas1minete = 59;
        #endregion
        #region 首个数据生成时间
        private static DateTime FirstDateTime;
        #endregion
        /// <summary>
        /// 外部调用此方法生成数据
        /// 随机生成数据,被动
        /// </summary>
        /// <returns>buffer:List<SimDataModel></returns>
        public SimDataModel SimData()
        {
            var mymodel = new SimDataModel();
            if (IHas1minete > 0)
            {
                SimDataDetail(ref mymodel);
            }
            else
            {
                SimDataDetail(ref mymodel);
                IHas1minete = 60;
                ICircle += 1;
            }
            IdAscend += 1;
            IHas1minete -= 1;
            return mymodel;
            //Timer mytimer = new Timer(new TimerCallback(timerCall), null, 0, 1000);
        }
        /// <summary>
        /// 生成模拟数据
        /// </summary>
        /// <param name="data"></param>
        private void SimDataDetail(ref SimDataModel data)
        {
            Random a = new Random();
            Random b = new Random();
            Random c = new Random();
            data.Id = IdAscend;
            data.Circle = ICircle;
            data.GroundPressure = (b.NextDouble() * 10) + 45;
            data.Temperature = ITemperature;
            ITemperature += b.Next(2, 5);//上一个温度数据随机增加，然后判断是否过大，过大重置为50
            if (ITemperature > 150)
            {
                ITemperature -= 100;
            }
            data.Flow = c.NextDouble() * (150 - 50) + 50;
            data.GenerateTime = DateTime.Now;
        }




        /// <summary>
        /// 外部调用此方法生成数据2 本生成规则是计算时间差获得环号，本质没变化
        /// 随机生成数据,被动
        /// </summary>
        /// <returns>buffer:List<SimDataModel></returns>
        public SimDataModel SimData2()
        {
            var mymodel = new SimDataModel();
            SimDataDetail2(ref mymodel);
            return mymodel;
        }
        /// <summary>
        /// 生成模拟数据2
        /// </summary>
        /// <param name="data"></param>
        private void SimDataDetail2(ref SimDataModel data)
        {
            Random a = new Random();
            Random b = new Random();
            Random c = new Random();
            data.Id = IdAscend;
            IdAscend += 1;
            data.GroundPressure = (b.NextDouble() * 10) + 45;
            data.Temperature = ITemperature;
            ITemperature += b.Next(2, 5);//上一个温度数据随机增加，然后判断是否过大，过大重置为50
            if (ITemperature > 150)
            {
                ITemperature -= 100;
            }
            data.Flow = c.NextDouble() * (150 - 50) + 50;
            data.GenerateTime = DateTime.Now;
            if (data.Id == 1) { FirstDateTime = data.GenerateTime; };//如果生成的是第一个数据，则把数据生成时间丢给静态时间FirstDateTime，方便计算环号
            var MinutesSpan = (data.GenerateTime - FirstDateTime).TotalSeconds;//获取时间差
            data.Circle = (int)MinutesSpan/60;//整除60获得环号
        }
    }
}
